import {
  reqOrderAddress,
  reqOrderInfo,
  reqBuyNowGoods,
  reqSubmitOrder,
  reqPrePayInfo,
  reqPayStatus
} from '../../../api/orderPay'
// 导入格式化时间的方法
import { formatTime } from '../../../utils/formatTime'
// 引入async-validator用于表单校验
import Schema from 'async-validator'
import { toast } from '@/utils/extendApi'
// 导入防抖函数
import { debounce } from 'miniprogram-licia'
import addressStoreBehavior from '@/behaviors/addressStoreBehavior'
// 获取全局的应用实例
const app = getApp()
Page({
  behaviors: [addressStoreBehavior],
  data: {
    orderAddress: {}, // 默认收货地址
    orderInfo: {}, // 订单详情
    goodsId: '', // 立即购买商品的id
    buyName: '', // 订购人姓名
    buyPhone: '', // 订购人手机号
    deliveryDate: '', // 期望送达日期
    blessing: '', // 祝福语
    show: false, // 期望送达日期弹框
    minDate: new Date().getTime(), // 当前日期时间戳
    orderNo: '' // 订单编号
  },
  // 选择期望送达日期
  onShowDateTimerPopUp() {
    this.setData({
      show: true
    })
  },
  // 期望送达日期确定按钮
  onConfirmTimerPicker(event) {
    // 使用Vant组件提供的事件选择组件，获取到选择的时间戳
    // 需要将时间戳转换成 年月日 格式
    // 可以调用小程序提供的格式化方法对时间进行转换
    // formatTime方法接收JS的日期对象作为参数，因此需要将时间戳转换为JS的日期对象
    const timeRes = formatTime(new Date(event.detail))
    this.setData({
      show: false,
      deliveryDate: timeRes
    })
  },
  // 期望送达日期取消按钮 以及 关闭弹框时触发
  onCancelTimePicker() {
    this.setData({
      show: false,
      minDate: new Date().getTime(),
      currentDate: new Date().getTime()
    })
  },
  // 跳转到收货地址
  toAddress() {
    wx.navigateTo({
      url: '/modules/settingModule/pages/address/list/index'
    })
  },
  // 获取订单收货地址
  async getOrderAddress() {
    // 判断 app.globalData.address 中是否存储有数据
    /* if (app.globalData.address.id) {
      // 存在收货地址，使用该地址作为收货地址
      this.setData({
        orderAddress: app.globalData.address
      })
      return
    } */
    if (this.data.currChooseAddress.id) {
      this.setData({
        orderAddress: this.data.currChooseAddress
      })
      return
    }
    // 不存在收货地址，则发请求获取默认收货地址作为收货地址
    const result = await reqOrderAddress()
    this.setData({
      orderAddress: result.data
    })
  },
  // 获取订单详情数据
  async getOrderInfo() {
    // 判断是否存在 goodsId，若存在获取立即购买商品的数据，不存在获取订单详情
    const { goodsId, blessing } = this.data
    // 解构并重命名获取到的数据
    const { data: orderInfo } = goodsId
      ? await reqBuyNowGoods({ goodsId, blessing })
      : await reqOrderInfo()
    // 获取祝福语，若购买多个商品获取第一个填写了祝福语的商品进行赋值
    // find()方法返回数组中满足提供的测试函数的第一个元素的值否则返回 undefined
    const { blessing: orderBlessing } = orderInfo.cartVoList.find(
      (item) => item.blessing
    ) || { blessing: '' }
    // 存储订单数据
    this.setData({
      orderInfo: orderInfo,
      blessing: orderBlessing
    })
  },
  // 表单验证 验证收货人订购人信息
  validatorOrder(params) {
    // 校验规则
    const rules = {
      buyName: [
        {
          required: true,
          message: '请输入订购人姓名'
        },
        {
          pattern: '^[a-zA-Z\\d\\u4e00-\\u9fa5]+$',
          message: '订购人姓名不合法'
        }
      ],
      buyPhone: [
        { required: true, message: '请输入订购人手机号' },
        {
          pattern:
            '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$',
          message: '订购人手机号不合法'
        }
      ],
      deliveryDate: [{ required: true, message: '请选择送达日期' }],
      blessing: [{ required: true, message: '请输入备注' }],
      cartList: [{ required: true, message: '订单不能为空' }],
      userAddressId: [{ required: true, message: '请选择收货地址' }]
    }
    // 实例化校验对象 并传递校验规则
    const validator = new Schema(rules)
    // 调用实例方法对请求参数验证 (返回Promise)
    return new Promise((reolve, reject) => {
      validator.validate(params, (error) => {
        if (error) {
          // 验证失败提示错误信息
          toast(error[0].message)
          reject(error) // 返回失败状态注入失败信息
        } else {
          // 验证成功
          return reolve('ok') // 返回成功状态
        }
      })
    })
  },
  // 提交订单
  submitOrder: debounce(async function () {
    // 从data中解构数据
    const {
      orderInfo,
      blessing,
      deliveryDate,
      buyPhone,
      buyName,
      orderAddress
    } = this.data
    // 整理请求参数
    const params = {
      buyName,
      buyPhone,
      deliveryDate,
      blessing,
      cartList: orderInfo.cartVoList,
      userAddressId: orderAddress.id
    }
    // 对请求参数进行验证 await右侧的Promise返回成功才会继续向下执行
    await this.validatorOrder(params)
    // 验证成功后发请求创建平台订单
    const result = await reqSubmitOrder(params)
    if (result.code === 200) {
      // 存储服务器返回的订单编号
      this.setData({
        orderNo: result.data
      })
      // 获取预付单信息（获取支付参数）
      this.advancePay()
    }
  }, 500),
  // 获取预付单信息(获取支付参数) 调用接口进行微信支付 调用接口查看支付状态
  async advancePay() {
    try {
      const payParams = await reqPrePayInfo(this.data.orderNo)
      if (payParams.code === 200) {
        // payParams.data: 支付参数
        // 调用wx.requestPayment进行微信支付
        const payInfo = await wx.requestPayment(payParams.data)
        // 获取支付的结果  {errMsg:'requestPayment:ok'} 支付成功
        if (payInfo.errMsg === 'requestPayment:ok') {
          // 调用接口查看支付的状态
          const payStatus = await reqPayStatus(this.data.orderNo)
          if (payStatus.code === 200) {
            // 支付成功，跳转到订单列表页面
            await wx.redirectTo({
              url: '/modules/orderPayModule/pages/order/list/list'
            })
            toast('支付成功', 'success')
          }
        }
      }
    } catch (error) {
      // 接口请求出错
      toast('支付失败', 'error')
      // 跳转到订单列表页面
      setTimeout(() => {
        wx.redirectTo({
          url: '/modules/orderPayModule/pages/order/list/list'
        })
      }, 1000)
    }
  },
  // 页面展示时触发不能使用onLoad(只执行一次)
  onShow() {
    // 获取收货地址
    this.getOrderAddress()
    // 获取订单数据
    this.getOrderInfo()
  },
  // 获取从商品详情页面传递的参数
  onLoad(options) {
    // 获取从商品详情页面传递的商品id和祝福语
    if (!options.goodsId) return
    const { goodsId, blessing } = options
    // 存储商品id和祝福语
    this.setData({
      goodsId,
      blessing
    })
  },
  onUnload() {
    // 在当前页面销毁后
    // 清空全局共享数据中的收货地址,下次购买商品依然使用默认地址作为收货地址
    // app.globalData.address = {}
    // this.chooseAddrss('')
  }
})
